package ioc
//之前，撤销函数是在Add/Delete时添加的，函数中包含了IntSet的操作，也就是Undo依赖IntSet
//而修改之后，撤销函数被抽象为Undo,撤销相关的工作直接调用Undo相关的工作即可，也就是IntSet依赖Undo
//Undo 控制逻辑 - 撤销动作
//IntSet是业务逻辑 - 保存数据的功能
//业务逻辑依赖控制逻辑，才能保证在复杂业务逻辑变化场景下，代码更健壮！
type Undo []func()

func (undo *Undo) Add(function func()) {
	*undo = append(*undo, function)
}
func (undo *Undo) Undo() error {
	functions := *undo
	index := len(functions) - 1
	if function := functions[index]; function != nil {
		function()
		functions[index] = nil
	}
	*undo = functions[:index]
	return nil
}
